package io.github.weiranyi;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import java.util.List;

// 1.产生超卖问题
public class SecKill2 {
    //秒杀过程
    public static String doSecKill(String uid, String prodid) {
        // 1.判断uid和prodid非空判断
        if (uid == null || prodid == null) {
            return "用户没有登录或者请选择要秒杀的商品";
        }
        // 2.连接redis
        Jedis jedis = new Jedis("192.168.128.128", 6379);
        // 3.拼接key
        // 3.1 库存key
        String kcKey = "sk:" + prodid + ":kc";
        // 3.2 秒杀成功用户key
        String userKey = "sk:" + prodid + ":usr";
        // 4.完成秒杀
        String result = "";
        /*应对超卖问题-添加乐观锁-监视库存*/
        jedis.watch(kcKey);
        // 4.1 获取库存
        String kc = jedis.get(kcKey);
        if (kc == null) {//4.2如果库存null，秒杀还没有开始
            System.out.println("秒杀还没有开始，请等待");
            result = "秒杀还没有开始，请等待";
        } else if (jedis.sismember(userKey, uid)) {//4.3 判断用户是否重复秒杀操作
            System.out.println("已经秒杀成功了，不能重复秒杀");
            result = "已经秒杀成功了，不能重复秒杀";
        } else if (Integer.parseInt(kc) <= 0) {//4.4判断如果商品数量，库存数量小于1，秒杀结束
            System.out.println("秒杀已经结束了");
            result = "秒杀已经结束了";
        } else {//4.5 秒杀
            /*应对超卖问题-使用事务*/
            Transaction multi = jedis.multi();
            /*应对超卖问题-改写为组队操作（jedis->multi）*/
            multi.decr(kcKey); //库存-1
            multi.sadd(userKey, uid);//把秒杀成功用户添加清单里面
            /*应对超卖问题-执行*/
            List<Object> results = multi.exec();
            if (results == null || results.size() == 0) {
                System.out.println("秒杀失败了....");
                result = "秒杀失败了....";
            } else {
                System.out.println("秒杀成功了..");
                result = "秒杀成功了..";
            }
        }
        jedis.close();
        return result;
    }
}
